﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//C语⾔提供了⼀种⾮常特别的语法，就是 goto 语句和跳转标号， goto 语句可以实现在同⼀个函数
//内跳转到设置好的标号处。
//int main()
//{
//	printf("hehe\n");
//	if (1)  //1为真，执行
//		goto end;     //跳转到end标记的地方，也就是end：  只能在同一个函数中跳转
//	
//	//如何没有if和gotoend那些，就是3个printf语句依次打印出来
//	printf("haha\n");//如果有了就是只打印hehe和end
//
//end:
//	printf("end\n");
//	return 0;
//}

//int main()
//{
//again:
//	printf("hehe\n");// 死循环打印hehe
//	goto again;
//	return 0;
//}
//本来 for 循环想提前退出得使⽤ break ，⼀个 break 只能跳出⼀层 for 循环，如果3层循环嵌套
//就得使⽤3个 break 才能跳出循环，所以在这种情况下我们使⽤ goto 语句就会更加的快捷。
//尽量少用goto语句

//关机程序
//1.程序运行起来的时候，就开始倒计时60秒关机
//2.如果你能输入：我是猪，就取消关机
//关机命令shutdown   -s 关机  -t 设置时间关机   shutdown -s -t//倒计时60秒关机   shutdown -a取消关机
//库函数 system --可以执行系统命令 需要头文件 stdlib.h
//两个字符串比较相等的时候，不能使用==，而应该使用strcmp这个库函数，头文件string.h
#include <string.h>
#include <stdlib.h>
//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 60");
//again:
//	printf("请注意，你的电脑在1分钟内关机，如果输入：我是猪，就取消关机\n");
//	scanf("%s", input); //输入的信息放在input数组里  ,数组不用使用&取地址了
//	//判断input中存放的是不是“我是猪”
//	//if("我是猪" == input) //不能这样，"我是猪"是一个字符串,input是数组
//	if (strcmp("我是猪", input) == 0)  //这个是唯一判断a与b是否完全相同的写法 因为这是字符串
// strcmp的设计就是用0表示字符串完全相等
//	{
//		system("shutdown -a");  //取消关机
//	}
//	else 
//	{
//		goto again;
//	}
//	return 0;
//}
//此代码如果不用goto语句
//int main()
//{
//	char input[20] = { 0 };
//	system("shutdown -s -t 60");
//	while (1)
//	{
//		printf("请注意，你的电脑在1分钟内关机，如果输入：我是猪，就取消关机\n");
//		scanf("%s", input); //输入的信息放在input数组里
//		//判断input中存放的是不是“我是猪”
//		//if("我是猪" == input) //不能这样，"我是猪"是一个字符串,input是数组
//		if (strcmp("我是猪", input) == 0)
//		{
//			system("shutdown -a");  //取消关机
//			break;
//		}
//	}
//	
//	return 0;
//}

//游戏要求：
//1. 电脑⾃动⽣成1~100的随机数
//2. 玩家猜数字，猜数字的过程中，根据猜测数据的⼤⼩给出⼤了或⼩了的反馈，直到猜对，游戏结束

//c语言提供了一个函数rand来生成随机数 ran（void）不需要含参数
//rand函数会返回⼀个伪随机数，这个随机数的范围是在0~RAND_MAX之间，这个RAND_MAX的⼤⼩是
//依赖编译器上实现的，但是⼤部分编译器上是32767。
//rand函数的使⽤需要包含⼀个头⽂件是：stdlib.h

#include <stdlib.h>
//int main()
//{ 
//	srand(1);
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	//运行两次的数字生成都一样，为什么？ rand函数生成随机数的默认种子是1
//	// 使用rand函数之前使用一个srand函数进行初始化随机数的生成器
//	//只要种子数一直变化，生成的随机数就变化
//	return 0;
//}

//我们一般使用时间作为随机数的生成器，时间一直在变化，time函数可以获得时间，需要头文件time.h
#include <time.h>
//int main()
//{	//设置随机数的生成起点（种子），第一次设置好这个种子就行了，后面的程序不用重复
//	srand((unsigned int)time(NULL));//（NULL）空指针，强制性转换为非负整数
//	printf("%d\n", rand());
//	printf("%d\n", rand());
//	printf("%d\n", rand());//这样生成的随机数就是一直变化的，而不是和之前一样是固定的
//	printf("%d\n", rand());
//	return 0;
//}
//或者这样
//int main()
//{
//	srand((unsigned int)time(NULL));
//	int i = 0;
//	for (i = 0; i < 10; i++)  //生成10个随机数
//	{
//		printf("%d\n", rand());
//	}
//		return 0;
//}

//如果我要生成0-99之间的随机数，方法如下： rand()%100  余数范围就是0-99
//如果我要生成1-100之间的随机数，方法如下：rand()%100 + 1   余数+1就是1到100
// 如果我要生成100-200之间的随机数，方法如下：100 + rand（）%（200-100+1） 余数范围0-100 加100就是100-200
//如果我要生成a-b之间的随机数，方法如下：a + ran()%(b-a+1)余数范围0到b-a  ＋a   就是a到b

//int main()
//{
//	srand((unsigned int)time(NULL));
//	int i = 0;
//	for (i = 0; i < 10; i++)  //生成10个随机数
//	{
//		printf("%d\n", rand()%100 + 1); //这样生成的随机数就是1到100了
//	}
//		return 0;
//}

//int main()
//{
//	int input = 0;
//	do
//	{
//		//打印菜单
//		printf("**********************************\n");
//		printf("*********** 1. play    ***********\n");
//		printf("*********** 0. exit    ***********\n");
//		printf("**********************************\n");
//
//		//选择
//		//int input = 0;
//		printf("请选择:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("猜数字\n");
//			break;
//		case 0:
//			printf("退出游戏\n");
//			break;
//		default:
//			printf("选择错误，重新选择\n");
//			break;
//		}
//		//如果选1 循环结束之后为真，继续循环，选择其他数也同理，如果选择0为假，则退出游戏即不进行循环了
//		//所以使用input很合适
//	} while (input);  //input 定义在循环外头，才能在这用
//	return 0;
//}

//可以把菜单放到一个函数里
void menu()//表示函数不返回任何值，所以void
{
	printf("**********************************\n");
	printf("*********** 1. play    ***********\n");
	printf("*********** 0. exit    ***********\n");
	printf("**********************************\n");
}

void game()
{
	//srand();  不应该在循环调用srand 应该在总代码中调用，这样才能设置一次就可以一直用
	//游戏的逻辑
	//1.生成随机数  
	int r = rand() % 100 + 1;//100到200的随机数
	// 2.猜数字
	int count = 5;
	
	//while (1) //这个是无限循环，没有次数限制，接下来我们可以加上次数限制，只能猜5次
	while(count)
	{
		printf("还有%d次机会\n", count);
		int guess = 0;
		printf("请猜数字:");
		scanf("%d", &guess);
		if (guess > r)
		{
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了\n");
			break;
		}
		count--; //猜一次count就-1
	}
	if (count == 0)  //如果是猜对了，break跳出这个循环，就不执行count--，count就不可能等于0，5次都错了才会等于0
	{
		printf("用完了所有机会，猜数字失败");
	}
}


int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//设置随机数的生成起点，整个过程中只用调用一次就可以
	do
	{
		//打印菜单
		menu();//直接调用就行

		//选择
		//int input = 0;
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//printf("猜数字\n");//这里应该是玩游戏的，不是直接输出猜数字
			game(); //直接用game函数代替
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误，重新选择\n");
			break;
		}
		//如果选1 循环结束之后为真，继续循环，选择其他数也同理，如果选择0为假，则退出游戏即不进行循环了
		//所以使用input很合适
	} while (input);  //input 定义在循环外头，才能在这用
	return 0;
}